﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;


namespace ConsoleApplication1
{
    public class Player
    {

// ---------------------------------------------- Deklaration der Variablen ----------------------------------------------

        // Observerliste, in der alle Beobachter von Player gespeichert werden
        private List<IObserver> Observerlist = new List<IObserver>();


        private int points;
        private int id;
        private int x; //X-Koordinate auf der Map
        private int y; //Y-Koordinate auf der Map
        private String description;
        private bool busy; 


// --------------------------------------------- Konstruktor Initialisierung ---------------------------------------------

        /*
         * Konstruktor des Players
         * Informationen werden aus der Liste ausgelesen und in die jeweilige Variable
         * abgespeichert und weiter verwendet
         * @param playerInformations beinhaltet sämtliche Informationen in einer Liste aus Strings
         */
        public Player( int id, int x, int y, String desc, bool busy, int pnts)
        {
            this.id = id;
            this.x = x;
            this.y = y;
            this.description = desc;
            this.busy = busy;
            this.points = pnts;

        }

// ------------------------------------------------ Observer Methoden -------------------------------------------------

        // Fügt Observer hinzu.
        public void AddObserver(IObserver observer)
        {
            if (observer != null)
            {
                this.Observerlist.Add(observer);
            }
        }

        // Löscht einen aktiven Observer.
        public void RemoveObserver(IObserver observer)
        {
            if (observer != null)
            {
                this.Observerlist.Remove(observer);
            }
        }

        // Benachrichtigt die Observer über die Änderung des Players.
        public void Notify()
        {
            foreach (IObserver observer in Observerlist) 
            {
                observer.update();
            }
        }

// ------------------------------------------------ Getter/Setter-Methoden -----------------------------------------------


        public List<IObserver> Observer
        {
            get
            {
                return this.Observerlist;
            }
            set
            {
                this.Observerlist = value;
            }
        }

        /*
         * Getter/Setter-Methode der Point-Variable, wird
         * zur Behandlung des Score-Systems verwendet
         * @return gibt den Gesamtpunktestand des Players an
         */
        public int Points
        {
            get
            {
                return this.points;
            }
            set
            {
                this.points = value;
            }
        }


        /*
         * Getter/Setter-Methode der Player-ID,
         * welcher zur Identifikation der jeweiligen Player benutzt wird
         * @return gibt die einmalige ID zurück
         */
        public int Id
        {
            get
            {
                return this.id;
            }
            set
            {
                this.id = value;
            }
        }


        /*
         * Getter/Setter-Methode der X-Variable, welche
         * zur Positionierung auf dem Spielfeld genutzt wird
         * @return gibt den Standpunkt auf der X-Achse zurück
         */
        public int X
        {
            get
            {
                return this.x;
            }
            set
            {
                this.x = value;
            }
        }


        /*
         * Getter/Setter-Methode der Y-Variable, welche
         * zur Positionierung auf dem Spielfeld genutzt wird
         * @return gibt den Standpunkt auf der Y-Achse zurück
            */
        public int Y
        {
            get
            {
                return this.y;
            }
            set
            {
                this.y = value;
            }
        }


        /*
         * Getter/Setter-Methode für die Playerbeschreibung
         * Die Beschreibung wird bei dem Spieler angezeigt
         * @return gibt die Spielerspezifische Beschreibung zurück
         */
        public String Description
        {
            get
            {
                return this.description;
            }
            set
            {
                this.description = value;
            }
        }


        /*
         * Getter/Setter-Methode für das "Type"-Attribut,
         * welches den Player in der Servernachricht identifiziert
         * @return gibt den Typ des Objects zurück (normalerweise "Player")
         */
        public String Type
        {
            get
            {
                return this.description;
            }
            set
            {
                this.description = value;
            }
        }


        /*
         * Getter/Setter-Methode zur Abfrage ob der Spieler beschäftigt ist,
         * d.h. ob er momentan ein Minigame spielt und somit nicht zu erreichen ist
         * @return gibt den Beschäftigtheitsstatus zurück
         */
        public bool Busy
        {
            get
            {
                return this.busy;
            }
            set
            {
                this.busy = value;
            }
        }

    
    }
}
